home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gigarom 1
/
Gigarom Macintosh Archives (Quantum Leap)(CDRM1080320)(1993).iso
/
FILES
/
APP
/
A-D
/
BBEdit 2.2.2.sea
/
BBEdit 2.2.2
/
BBEdit Extensions
/
Sources
/
prefix.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-27
|
4KB
|
194 lines
#include <SetupA4.h>
#include "ExternalInterface.h"
#include "DialogUtilities.h"
/*
This external shows the use of some less trivial functionality.
It puts up a dialog, and uses the text entered in the text field
to prefix every line, optionally in the selection.
*/
enum
{
sel_only = 3,
insert,
delete,
beginning,
end,
prefix_str
};
static struct
{
Boolean insert;
Boolean line_start;
Boolean sel_only;
Boolean pad;
Str255 prefix_str;
} prefix_info;
static void maintain_buttons(DialogPtr d)
{
SetDlgCtl(d, insert, prefix_info.insert);
SetDlgCtl(d, delete, ! prefix_info.insert);
SetDlgCtl(d, beginning, prefix_info.line_start);
SetDlgCtl(d, end, ! prefix_info.line_start);
SetDlgCtl(d, sel_only, prefix_info.sel_only);
}
pascal void main(ExternalCallbackBlock *callbacks, WindowPtr w)
{
DialogPtr d;
GrafPtr save_port;
long sel_end, sel_start, first_char;
long start_line, end_line;
long old_start;
short item;
Handle text;
char *s;
RememberA0();
SetUpA4();
GetPort(&save_port);
d = callbacks->CenterDialog(128);
SetPort(d);
callbacks->GetSelection(&sel_start, &sel_end, &first_char);
prefix_info.insert = TRUE;
prefix_info.line_start = TRUE;
BlockMove("\p> ", prefix_info.prefix_str, 3);
prefix_info.sel_only = sel_end != sel_start;
XAbleDlgCtl(d, sel_only, prefix_info.sel_only);
SetStrItem(d, prefix_str, prefix_info.prefix_str);
SelIText(d, prefix_str, 0, 255);
do {
maintain_buttons(d);
ModalDialog(callbacks->StandardFilter, &item);
switch (item)
{
case insert:
case delete:
prefix_info.insert = (item == insert);
break;
case beginning:
case end:
prefix_info.line_start = (item == beginning);
break;
case sel_only:
prefix_info.sel_only = ! prefix_info.sel_only;
break;
}
} while ((item != 1) && (item != 2));
ReadStrItem(d, prefix_str, prefix_info.prefix_str);
DisposDialog(d);
SetPort(save_port);
if (item == 1) {
start_line = 0;
end_line = callbacks->GetLastLine();
if (prefix_info.sel_only) {
start_line = callbacks->GetLineNumber(sel_start);
end_line = callbacks->GetLineNumber(sel_end);
};
s = (char *)&prefix_info.prefix_str[0];
if (s[0] != 0)
{
text = callbacks->GetWindowContents(w);
callbacks->StartProgress("\pChanging Lines…", end_line - start_line, FALSE);
old_start = start_line;
if (prefix_info.line_start)
{
if (prefix_info.insert)
{
for ( ; start_line < end_line; start_line++) {
callbacks->DoProgress(start_line - old_start);
sel_start = callbacks->GetLinePos(start_line);
callbacks->SetSelection(sel_start, sel_start, first_char);
callbacks->Insert((char *)&s[1], s[0]);
};
}
else
{
for ( ; start_line < end_line; start_line++) {
callbacks->DoProgress(start_line - old_start);
sel_start = callbacks->GetLinePos(start_line);
if (callbacks->FindPattern(*text, sel_start + s[0] + 1, sel_start,
&s[1], s[0], FALSE) >= 0)
{
callbacks->SetSelection(sel_start, sel_start + s[0], first_char);
callbacks->Delete();
}
};
}
}
else
{
if (prefix_info.insert)
{
for ( ; start_line < end_line; start_line++) {
callbacks->DoProgress(start_line - old_start);
sel_start = callbacks->GetLinePos(start_line);
sel_start = callbacks->GetLineEnd(sel_start);
callbacks->SetSelection(sel_start, sel_start, first_char);
callbacks->Insert((char *)&s[1], s[0]);
};
}
else
{
for ( ; start_line < end_line; start_line++) {
callbacks->DoProgress(start_line - old_start);
sel_start = callbacks->GetLinePos(start_line);
sel_end = callbacks->GetLineEnd(sel_start);
if (callbacks->FindPattern(*text, sel_end, sel_end - s[0],
&s[1], s[0], FALSE))
{
callbacks->SetSelection(sel_end - s[0], sel_end, first_char);
callbacks->Delete();
}
};
}
}
callbacks->DoneProgress();
}
};
RestoreA4();
}